//3011.判断一个数组是否可以变为有序
//https://leetcode.cn/problems/find-if-array-can-be-sorted
class Solution {
public:
    bool canSortArray(vector<int>& nums) {
        //分组排序 二进制位相同的在一起排序
        int n = nums.size();
        for(int i = 0;i<n;)
        {
            //定义第一个区间组
            int l = i;
            //区间组的第一个数二进制位1的个数
            int cnt = __builtin_popcount(nums[i++]);
            //判断后面有多少个与该数位数相同的数
            while(i < n && __builtin_popcount(nums[i]) == cnt) ++i;
            //对这一组数进行排序
            sort(nums.begin()+l,nums.begin()+i);
        }
        //对位中1相同的组排序后 如果出现
        //判断是否满足升序排序规则
        return ranges::is_sorted(nums);
    }
};
